package flare.animate.interpolate
{
  /**
   * Interpolator for arbitrary <code>Object</code> values. Simply swaps the
   * initial value for the end value for interpolation fractions greater
   * than or equal to 0.5.
   */
  public class ObjectInterpolator extends Interpolator
  {
    private var _start:Object;
    private var _end:Object;

    /**
     * Creates a new ObjectInterpolator.
     * @param target the object whose property is being interpolated
     * @param property the property to interpolate
     * @param start the starting object value to interpolate from
     * @param end the target object value to interpolate to
     */
    public function ObjectInterpolator(target:Object, property:String, start:Object, end:Object)
    {
      super(target, property, start, end);
    }

    /**
     * Initializes this interpolator.
     * @param start the starting value of the interpolation
     * @param end the target value of the interpolation
     */
    protected override function init(start:Object, end:Object):void
    {
      _start = start;
      _end = end;
    }

    /**
     * Calculate and set an interpolated property value. This method sets
     * the target object's property to the starting value if the
     * interpolation fraction is less than 0.5 and to the ending value if
     * the fraction is greather than or equal to 0.5.
     * @param f the interpolation fraction (typically between 0 and 1)
     */
    public override function interpolate(f:Number):void
    {
      _prop.setValue(_target, f < 0.5 ? _start : _end);
    }
  } // end of class ObjectInterpolator
}